package com.huangpeng.algorithm.robRedPacket;

import java.util.Random;

/**
 * @Author hp
 * @Title 第一种：抢红包时随机生成红包（规定总金额和数量）
 * @Package
 * @Date 2022/1/29 16:45
 * @Description 红包： 在抢红包的过程中剩余金额会不断减少，要保证不能两个人同时抢，需要加上悲观锁，同一时间只可以一个人抢，加synchronized锁
 * 算法-二倍均值法
 * @Version 1.0
 */
public class RedPacket1 {
    private Double total;//总钱数
    private int totalVal; // 总钱数小数化整数
    private int count; //红包总数

    public RedPacket1(Double total, int count) {
        this.totalVal = ((int) (total * 100));//把总钱数化为整数
        this.count = count;
    }

    public synchronized double getRandomMoney(){
        int val;//每个人分配到的金额*100
        //当剩下的每一个人只分到一分钱的时候
        if(count != 0 && totalVal / count == 1){
            val = 1;
            totalVal = totalVal - val;
            count --;
            return (val / 100.0);
        }
        if(count < 0){
            val = 0;
        }else if(count == 1){
            val = totalVal;//如果是最后一个
        }else{
            int temp;//剩下的金额
            while(true){
                // 随机生成当前金额的随机数 [0,totalVal/count-1),尽量平均一点
                val = new Random().nextInt(totalVal / count * 2);
                temp = totalVal - val;
                // 判断生成的金额大于0，且剩余的钱数够剩下人平分到0.01元
                if((temp * 1.0) / (count - 1) >= 1 && val > 0){
                        break;
                }
            }
            totalVal = totalVal - val;
        }
        count --;
        return (val / 100.0);
    }

    public static void main(String[] args) {
        RedPacket1 hongBao =new RedPacket1(8.1,8);
        UserThread1 user = new UserThread1(hongBao);
        for(int i=0;i<10;i++) {
            new Thread(user).start();
        }
    }
}
